/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package util;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;

import java.beans.Statement;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.*;

import static java.lang.System.*;

/**
 *
 * @author Altair
 * калс только подключается к базе данных, будут добавлены опереция загрузки данных 
 * в базу посредствам инсертов
 * 
 */
public class workWithDB {


    /**
     *
     * @param value  - имя объекта
     * @param name   - имя листа, содержащего объекты
     * @param con - подключение к БД
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     * класс работает с обыектами генерит уникальные номера и
     * добавляет в базу в Paras  имена и id в щиоусеы id b type_id
     *
     */
    public boolean addObj(ArrayList<String> value, String name, Connection con)
            throws ClassNotFoundException, SQLException{
        /*
         * name параметр имени листа считывания или типа объектов
         * con - Соединение с БД
         * value - имя объекта, записанное в лист
         */
        int obj_id = 0;
        int type_id = 0;
        boolean flag = false;
        String sql_request;


        java.sql.Statement stmt = con.createStatement();
        sql_request = "select OBJECT_TYPE_ID from OBJECT_TYPES where NAME = (?)";
        PreparedStatement pr_SQL_Request = con.prepareStatement(sql_request);
        pr_SQL_Request.setString(1, name);

            
        ResultSet res_set = pr_SQL_Request.executeQuery();
        res_set.next();
        type_id = res_set.getInt("OBJECT_TYPE_ID");
        sql_request = "select ATTR_ID from ATTRIBUTES where NAME = (?)";
        pr_SQL_Request = con.prepareStatement(sql_request);
        pr_SQL_Request.setString(1, "Name");
        res_set = pr_SQL_Request.executeQuery();
        res_set.next();
        int at_id = res_set.getInt("ATTR_ID");
        res_set = stmt.executeQuery("select max (OBJECT_ID) from OBJECTS");
        res_set.next();
        obj_id = obj_id + res_set.getInt(res_set.getRow());
        String sqlExp1 = "INSERT INTO TEST.OBJECTS "
                + "(OBJECT_ID, OBJECT_TYPE_ID) VALUES (?, ?)";
        String sqlExp2 = "INSERT INTO TEST.PARAMS "
                + "(OBJECT_ID, ATTR_ID, VALUE) VALUES (?, ?, ?)";

        PreparedStatement pr_SqlExp1 = con.prepareStatement(sqlExp1);
        PreparedStatement pr_SqlExp2 = con.prepareStatement(sqlExp2);
        Iterator<String> art = value.iterator();

        Random rd = new Random();
        while(art.hasNext()){
            String val = art.next();
            obj_id = obj_id + rd.nextInt(10)+1;
            pr_SqlExp1.setInt(1, obj_id);
            pr_SqlExp1.setInt( 2, type_id);
            pr_SqlExp2.setInt(1, obj_id);
            pr_SqlExp2.setInt(2, at_id);
            pr_SqlExp2.setString(3, val);
            try{

                pr_SqlExp1.executeUpdate();
                pr_SqlExp2.executeUpdate();
            } catch(SQLException ex) { ex.printStackTrace();}

        }







        flag = true;    


        return flag;
    }

    /**
     *
     * @param value    - значение типа объекта (его имя)
     * @param con  - соединение с БД
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     * класс добавляет Object_type b object_type_id  в базу из value
     */
    public boolean addObj_type(ArrayList<String> value, Connection con)
            throws ClassNotFoundException, SQLException{
        int id = 0;        
        boolean flag = false;


            java.sql.Statement stmt = con.createStatement();


          String sqlExp = "INSERT INTO TEST.OBJECT_TYPES "
                  + "(OBJECT_TYPE_ID, NAME) VALUES (?, ?)";  
          PreparedStatement pr_SqlExp = con.prepareStatement(sqlExp);
          Iterator<String> art = value.iterator();
          while(art.hasNext()){
              Random rd = new Random();

              String nam = art.next();
              pr_SqlExp.setString( 2 ,nam );
              /**
               * гениратор уникальных id по средствам получения 
               * hashCode имени и сложением его с сиситемным временем
              */
              id = id + rd.nextInt(id+5) + nam.length();
              pr_SqlExp.setInt(1, id);
              try{
                  pr_SqlExp.executeUpdate();
              } catch(SQLException ex) { ex.printStackTrace();}
              
          }
                      
        flag = true;    


        return flag;
    }

    /**
     *
     * @param value  - значение атрибута( имя атрибута)
     * @param con - соединение с БД
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean addAtr(ArrayList<String> value, Connection con)
            throws ClassNotFoundException, SQLException{
        /*
         * name  - это имя вносимого параметра (т.е name, cost, code, Waranty)
         */
        int id = 0;        
        boolean flag = false;
      

          String sqlExp = "INSERT INTO TEST.ATTRIBUTES "
                  + "(ATTR_ID, NAME) VALUES (?, ?)";  
          PreparedStatement pr_SqlExp = con.prepareStatement(sqlExp);
          Iterator<String> art = value.iterator();
          while(art.hasNext()){
              Random rd = new Random();
              String nam = art.next();
              pr_SqlExp.setString( 2 ,nam );
              id = new String(nam).hashCode() + (int) currentTimeMillis();
              pr_SqlExp.setInt(1, id);
              try{
                  pr_SqlExp.executeUpdate();
              } catch(SQLException ex) { ex.printStackTrace();}
              
          }
                      
        flag = true;    


        return flag;
    }

    /**
     *
     * @param sheet_name  - имя листа
     * @param atr_name  - имя атрибута
     * @param con  - подключение к БД
     * @param in - поток входного файла, который добавляется в БД
     * @return
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean addAtr_Obj_type(String sheet_name, String atr_name, Connection con, InputStream in)
            throws ClassNotFoundException, SQLException{

        int obj_id = 0, atr_id = 0;
        boolean flag = false;
        String sql_request;
        
        try {
            HSSFWorkbook wb = new HSSFWorkbook(in);
            importXLS imp = new importXLS(); 
            if (imp.aceptColumnIndIndex(atr_name, wb, sheet_name)!=-1) {
              java.sql.Statement stmt = con.createStatement();            
              String sqlExp = "insert into ATTR_OBJECT_TYPES ( ATTR_ID," +
                  " OBJECT_TYPE_ID, SHOW_ORDER )  VALUES (?, ?, ?)";

              PreparedStatement pr_SqlExp = con.prepareStatement(sqlExp);
              ResultSet res_set;
              sql_request = "select OBJECT_TYPE_ID from OBJECT_TYPES where NAME = (?)";  
              PreparedStatement pr_SQL_request = con.prepareStatement(sql_request);
              pr_SQL_request.setString(1, sheet_name);
              res_set = pr_SQL_request.executeQuery();  
              res_set.next();
              obj_id = res_set.getInt("OBJECT_TYPE_ID");
              pr_SqlExp.setInt(1, obj_id);
              
            /**
             * оставил как образец запроса без  PreparedStatement
              res_set = stmt.executeQuery("select ATTR_ID from ATTRIBUTES where name = '"+atr_name+"'");
             
             */

              sql_request = "select ATTR_ID from ATTRIBUTES where NAME = (?)";
              pr_SQL_request = con.prepareStatement(sql_request);
              pr_SQL_request.setString(1, atr_name);
              res_set = pr_SQL_request.executeQuery();
              res_set.next();
              atr_id = res_set.getInt("ATTR_ID");
              
              pr_SqlExp.setInt( 2 , atr_id );
              pr_SqlExp.setInt(3, 0);

              try{
                  pr_SqlExp.executeUpdate();
              } catch(SQLException ex) { ex.printStackTrace();}
              

                      
        flag = true;    
        }
        else { 
        flag = false;
        }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return flag;
    }

    /**
     *
     * @param value  - значение параметра
     * @param obj  - имя объекта к которому относится параметр
     * @param param_name - имя параметра
     * @param con - подключение к БД
     * @return   boolean в зависимости от результата.
     * @throws ClassNotFoundException
     * @throws SQLException
     */
    public boolean addParam(String value, String obj, String param_name , Connection con)
            throws ClassNotFoundException, SQLException{

        boolean flag = false;
        int obj_id = 0;
        int atr_id = 0;
        String sql_request;
        PreparedStatement pr_SqlExp;
        java.sql.Statement stmt = con.createStatement();


        try{
            /**
             * Элемен отвечает за запрос в params obj_id
             * значение id объекта
             */

             sql_request =  "select OBJECT_ID from PARAMS where VALUE = (?)";
             pr_SqlExp = con.prepareStatement(sql_request);
             pr_SqlExp.setString(1, obj);
             String  object = obj;
             ResultSet res_set = pr_SqlExp.executeQuery();
             res_set.next();
             obj_id = res_set.getInt("OBJECT_ID");

            /**
             * Элемент отвечает за запрос в atributes
             * узнает значение id атрибута
             */

              sql_request =  "select ATTR_ID from ATTRIBUTES where NAME = (?)";
              pr_SqlExp = con.prepareStatement(sql_request);
              pr_SqlExp.setString(1, param_name);
              res_set = pr_SqlExp.executeQuery();
              res_set.next();
              atr_id = res_set.getInt("ATTR_ID");
          } catch (SQLException ex) {
              ex.printStackTrace();
          }
          String sqlExp = "INSERT INTO TEST.PARAMS "
                  + "(OBJECT_ID, ATTR_ID, VALUE) VALUES (?, ?, ?)";  
           pr_SqlExp = con.prepareStatement(sqlExp);

              pr_SqlExp.setInt(1, obj_id);
              pr_SqlExp.setInt(2, atr_id);
              pr_SqlExp.setString( 3 , value );
              try{
                  pr_SqlExp.executeUpdate();
              } catch(SQLException ex) { ex.printStackTrace(); return  flag;}
              

                      
        flag = true;    

        return flag;
    }

   
    
}